package com.witmore.neutron.ai.web.apiv2.login;

import com.jk.common.enums.WitmoreErrorCode;
import com.jk.common.response.ResponseResult;
import com.jk.mp.wx.response.WechatAuthAccessToken;
import com.witmore.neutron.ai.db.entity.UserDO;
import com.witmore.neutron.ai.web.annotation.NoLoginRequired;
import com.witmore.neutron.ai.web.controller.vo.UserSession;
import com.witmore.neutron.ai.web.service.impl.UserServiceImpl;
import com.witmore.neutron.ai.web.wechat.dto.WechatUserInfo;
import com.witmore.neutron.ai.web.wechat.service.WechatOAuthService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

/**
 * V2 微信授权登录控制器
 * Author: 豆子高
 * Date: 2025/01/21
 */
@Slf4j
@RestController
@RequestMapping("/v2/wechat/auth")
public class WechatAuthApiControllerV2 {

    @Autowired
    private WechatOAuthService wechatOAuthService;

    @Autowired
    private UserServiceImpl userServiceImpl;

    /**
     * 通过微信授权码获取用户信息并入库
     *
     * @param code 微信授权码
     * @return 用户信息
     */
    @NoLoginRequired
    @PostMapping("/login")
    public ResponseResult<UserSession> loginByCode(@RequestParam("code") String code) {
        try {
            log.info("收到前端微信授权码: {}", code);

            // 1. 参数校验
            if (!StringUtils.hasText(code)) {
                return ResponseResult.fail(WitmoreErrorCode.PARAM_ERROR.getCode(), "授权码不能为空");
            }

            // 2. 通过code换取access_token（带缓存和自动刷新机制）
            WechatAuthAccessToken accessToken = wechatOAuthService.getValidAccessToken(code, null);
            log.info("获取到微信access_token: openid={}, scope={}",
                    accessToken.getOpenid(), accessToken.getScope());

            UserDO user;
            WechatUserInfo userInfo;

            // 3. 根据授权范围获取用户信息
            if ("snsapi_userinfo".equals(accessToken.getScope())) {
                // 获取用户详细信息（使用缓存的有效token）
                WechatAuthAccessToken validToken = wechatOAuthService.getValidAccessToken(null, accessToken.getOpenid());
                userInfo = wechatOAuthService.getUserInfo(
                        validToken.getAccessToken(), validToken.getOpenid());
                log.info("获取到微信用户详细信息: openid={}, nickname={}",
                        userInfo.getOpenid(), userInfo.getNickname());

                // 处理用户登录（入库）
                user = wechatOAuthService.processWechatLogin(userInfo);
            } else {
                // 仅有openid的情况，创建基础用户信息
                WechatUserInfo basicUserInfo = new WechatUserInfo();
                basicUserInfo.setOpenid(accessToken.getOpenid());

                // 处理用户登录（入库）
                user = wechatOAuthService.processWechatLogin(basicUserInfo);
            }

            return ResponseResult.success(userServiceImpl.setUserSession(user));

        } catch (Exception e) {
            log.error("微信授权登录失败", e);
            return ResponseResult.fail(WitmoreErrorCode.SYSTEM_ERROR.getCode(), "微信授权登录失败: " + e.getMessage());
        }
    }

}
